# 1.一行代码实现1到100的数字和
print(sum(range(1, 101)))
# 2.如何在一个函数内修改全局变量

a = 10


def fn():
    global a
    a = 20


fn()
print(a)

# 3.列举五个常用的标准库
# os 操作系统相关联的函数
# sys 系统命令行
# re 正则表达式
# math 数学计算
# datetime 处理日期

# 4.字典如何删除键和合并字典？
# 使用del删除字典的键，使用update来合并两个字典
dic1 = {'name': 'zs', 'age': 18}
del dic1['name']
print(dic1)
dic2 = {'name': 'cs'}
dic1.update(dic2)
print(dic1)

# 5.浅谈python的GIL
# GIL是python的全局解释器锁，同一进程中假如有多个线程运行，一个线程在运行python程序时会霸占python解释器(加了一个锁即GIL)
# ，使该进程内的其他线程无法运行，等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作，则解释器锁解开，使其他
# 线程运行。所以在多线程中，线程的运行仍是有先后顺序的，并不是同时进行。
# 多进程中因为每个进程都能被系统分配资源，相当于每个进程都有了一个python解释器，所有多进程可以实现多个进程同时运行，缺点是
# 进程系统资源开销大

# 6.python实现列表去重
lst3 = [1, 2, 3, 4, 2, 3, 4, 6, 7, 8, 11, 21, 11, 23]
lst3 = list(set(lst3))
print(lst3)


# 7.func(*args,**kwargs)中的*args和**kwargs什么意思？
# *args和**kwargs主要用于函数定义。你可以将不定数量的参数传递给一个函数。这里不定数量的意思是：事先不知道函数使用者会有多
# 少个参数传递给你，所以在这个场景下使用这两个关键字。*args是用来发送一个非键值对的可变数量的参数列表给一个函数，举例说明：


# 计算多个数字相加
def func1(*args):
    sum = 0
    for i in args:
        sum += i
    return sum


print(func1(10, 20, 30, 40, 50))


# **kwargs允许你将不定长度的键值对作为参数传递给一个函数，如果你想要一个函数处理带名字的参数，你应该使用**kwargs。举例说明：


def func2(**kwargs):
    for key, value in kwargs.items():
        print(key, value)


func2(name='cs')

# 8.python2和python3中range(100)的区别。
# python2中range(100)返回的是列表，python3中range(100)返回的是迭代器，节约内存。

# 9.什么样的语言能够用装饰器？
# 函数可以作为参数传递的语言，可以使用装饰器。

# 10.python的内建数据类型有哪些？
# 整型-int 布尔型-bool 字符串-str 列表-list 字典-dict 元组-tuple

# 11.python中随机生成整数、小数、0-1之间的小数的方法
# 随机整数：ramdam.randint(a,b),生成区间内的整数
# 随机小数：习惯用numpy库，利用np.random.randn(5)生成5个随机小数
# 0-1随机小数：random.random(),括号中不传参

import random

# from numpy import np

a = random.randint(1, 100)
b = random.uniform(1, 100)
# print(b)
# b = round(b, 2) # 可以使用round四舍五入保留两位小数
c = round(random.random(), 2)

print('随机正整数：{}'.format(a))
print('随机小数：{}'.format(b))
print('0-1随机小数：{}'.format(c))

# 12.避免转义给字符串加上 'r' 就可以表示原字符串。
print(r'D:\codes\study\lesson\practise\all.py')

# 13.正则表达式
# 提取'中国'两个汉字
import re

str = '<div class="name">中国</div>'
result = re.findall(r'<div class=".*">(.*?)</div>', str)

print(result)

# (.*) 是贪婪匹配，会把满足正则的尽可能多的往后匹配
# (.*?) 是非贪婪匹配，会把满足正则的尽可能少的匹配
str = '<a>哈哈</a><a>呵呵</a>'
result1 = re.findall('<a>(.*)</a>', str)
result2 = re.findall('<a>(.*?)</a>', str)

print('贪婪匹配：{}'.format(result1))
print('非贪婪匹配：{}'.format(result2))

# 14.简述多进程和多线程
# 进程：
# 1.操作系统进行资源调度和分配的基本单位，多个进程之间独立。
# 2.稳定性好，如果一个进程崩溃，不影响其他进程，但是进程消耗资源大，开启的进程数量有限制。
# 线程：
# 1.CPU进行资源调度和分配的基本单位，线程是进程的一部分，是比进程更小的能独立运行的基本单位，一个进程下
# 可以有多个线程，可以共享该进程的所有资源。
# 2.如果IO操作密集，则可以多线程运行效率高，缺点是一个线程奔溃，都会造成整个进程崩溃。
# 应用：
# 1.IO密集的用多线程，在用户输入，sleep时，可以切换到其他线程处理，减少等待时间。
# 2.CPU密集的用多进程，因为假如IO操作少，用多线程的话，因为线程共享一个全局解释器锁(GIL),当前运行的线程
# 会霸占GIL，其他线程没有GIL，就不能充分利用多核CPU的优势。

# 15.同源策略
# 同源策略需要满足三个条件：
# 1.协议相同
# 2.域名相同
# 3.端口相同
# 只要不满足其中任意一个条件，就不符合同源策略，就会出现跨域。

# 16.any()和all()的区别
# any():只要迭代器中有一个元素为真则结果为真。
# all():迭代器中所有的判断项返回为真，则结果为真。
# python中什么元素为假？
# 0,空字符串,空列表,空字典,空元组,None,False
bool(0)
bool('')
bool([])
bool({})
bool(())
bool(None)

# any()
a = [True, False]
a1 = any(a)
a2 = all(a)
print(a1, a2)
